/**
 * 在自定义生命周期函数中，不建议进行耗时的操作，因为框架会有启动的超时检测。
 */
const { standTables } = require("./app/tables-data");
const { getDataSet, getSqlFields, getFormItems, getTableCols } = require("./scripts/note/core/compile/mysql/index");

let hasWrite = false;
module.exports = class AppBootHook {
  constructor(app) {
    this.app = app;
  }
  /**
   * 此时 config 文件已经被读取并合并，但还并未生效
   * 这是应用层修改配置的最后机会
   * 注意：此函数只支持同步调用
   * @example 场景示例：
   */
  configWillLoad() {
    this.app.standTables = standTables;
    //   // 例如：参数中的密码是加密的，在此处进行解密
    //   this.app.config.mysql.password = decrypt(this.app.config.mysql.password);
    //   // 例如：插入一个中间件到框架的 coreMiddleware 之间
    //   const statusIdx = this.app.config.coreMiddleware.indexOf("status");
    //   this.app.config.coreMiddleware.splice(statusIdx + 1, 0, "limit");
  }
  /**
   * 所有配置已经加载完毕。可以用来加载应用自定义的文件，启动自定义服务
   * @example 例：创建自定义应用的实例、加载自定义目录
   */
  async didLoad() {
    //   // 例如：创建自定义应用的实例
    //   this.app.queue = new Queue(this.app.config.queue);
    //   await this.app.queue.init();
    //   // 例如：加载自定义目录
    //   this.app.loader.loadToContext(path.join(__dirname, "app/tasks"), "tasks", {
    //     fieldClass: "tasksClasses",
    //   });
  }

  /**
   * 所有插件已启动完毕，但应用整体尚未 read，可进行数据初始化等操作，这些操作成功后才启动应用
   * @example 例：从数据库加载数据到内存缓存
   */
  async willReady() {
    //   this.app.cacheData = await this.app.model.query(QUERY_CACHE_SQL);
  }

  /**
   * 应用已启动完毕
   */
  async didReady() {
    //   const ctx = await this.app.createAnonymousContext();
    //   await ctx.service.Biz.request();
  }

  /**
   * http/https 服务器已启动，开始接收外部请求。此时可以从 app.server 获取 server 实例
   */
  async serverDidReady() {
    //   this.app.server.on("timeout", socket => {
    //     // 处理 socket 超时
    //   });
  }
};
